package com.yxqz.manage_cms_client.service;

import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.model.GridFSFile;
import com.xuecheng.framework.domain.cms.CmsPage;
import com.xuecheng.framework.domain.cms.CmsSite;
import com.xuecheng.framework.domain.cms.response.CmsCode;
import com.xuecheng.framework.exception.ExceptionCast;
import com.yxqz.manage_cms_client.dao.CmsPageRepository;
import com.yxqz.manage_cms_client.dao.CmsSiteRepository;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.stereotype.Service;

import java.io.*;
import java.util.Optional;

/**
 * @author 鱼香茄子
 * @data 2021/10/26
 */

@Service
public class PageService {
    //    添加日志
    private static final Logger LOGGER = LoggerFactory.getLogger(PageService.class);


    //   manage_cms_client中的 CmsPage接口
    @Autowired
    CmsPageRepository cmsPageRepository;


    //   manage_cms_client中的 cmsSiteRepository 接口
    @Autowired
    CmsSiteRepository cmsSiteRepository;


    //   GridFsTemplate ：org.springframework.data.mongodb.gridfs;
    @Autowired
    GridFsTemplate gridFsTemplate;

    //     package com.mongodb.client.gridfs; 读取数据到本地
//    这里在当前模块的config下下mongoConfig中已经注册了Bean了
    @Autowired
    GridFSBucket gridFSBucket;


    /**
     * 保存html页面到服务器物理路径
     *
     * @param pageId 页面id
     *               从gridFs查询到html文件 从cmsPage中获取
     *               将html文件保存到服务器的物理路径
     */
    public void savePageToServerPath(String pageId) throws IOException {
//        通过pageid查询页面信息
        CmsPage cmsPage = this.findCmsPageById(pageId);

//        得到html文件id，从cmspage中获取htmlFileId内容  查询页面静态文件
        String htmlFileId = cmsPage.getHtmlFileId();
//        通过文件id从Gridfs中查询文件内容 查询html
        InputStream inputStream = this.getFileById(htmlFileId);
        if (inputStream == null) {
            LOGGER.error("获取html文件的报错，当前查询的htmlFileId：" + htmlFileId);
            ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_HTMLISNULL);
        }

//        获取站点信息
        String siteId = cmsPage.getSiteId();
        CmsSite cmsSiteBySiteId = findCmsSiteBySiteId(siteId);
//        获取站点的物理路劲
        String sitePhysicalPath = cmsSiteBySiteId.getSitePhysicalPath();
        if (sitePhysicalPath == null) {
            LOGGER.error("获取站点信息错误，当前的使用的站点id：" + siteId);
            ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAURLISNULL);
        }

//        获取页面的物理路径。拼接 页面物理路径=站点物理路径+页面物理路径+页面名称。
        FileOutputStream fileOutputStream = null;
        String pagePath = sitePhysicalPath + cmsPage.getPagePhysicalPath() + cmsPage.getPageName();

//        将html保存到物理路径
        fileOutputStream = new FileOutputStream(new File(pagePath));
        IOUtils.copy(inputStream, fileOutputStream);
//        关闭流
        inputStream.close();
        fileOutputStream.close();

    }


    /**
     * 通过站点id查询站点对象（信息）
     *
     * @param siteid 站点id
     * @return 页面对象
     * findById 是mongo接口自带的方法
     */
    public CmsSite findCmsSiteBySiteId(String siteid) {
        Optional<CmsSite> optional = cmsSiteRepository.findById(siteid);
        if (optional.isPresent()) {
            CmsSite cmsSite = optional.get();
            return cmsSite;
        }
        return null;
    }


    /**
     * 通过文件id从Gridfs中查询文件内容
     *
     * @param htmlFileId html文件id
     */
    public InputStream getFileById(String htmlFileId) throws IOException {
//        获取文件对象
        GridFSFile fsTemplateOne = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(htmlFileId)));
//        打开下载流
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(fsTemplateOne.getObjectId());
//        定义 GridFsResource
        GridFsResource resource = new GridFsResource(fsTemplateOne, gridFSDownloadStream);
        return resource.getInputStream();

    }


    /**
     * 通过id查询页面信息
     *
     * @param pageId
     * @return
     */
    public CmsPage findCmsPageById(String pageId) {
        Optional<CmsPage> optional = cmsPageRepository.findById(pageId);
        if (optional.isPresent()) {
            CmsPage cmsPage = optional.get();
            return cmsPage;
        }
        return null;
    }
}
